# -*- coding: utf-8 -*-
# @Time    : 2024/6/7 18:05
# @Author  : yujiahao
# @File    : 10_small_data_pool.py
# @description:【拓展】Python中的【小数据池】，此小数据池非彼数据池



"""
一、小数据池

    【== id is】

        我们讲解一下小数据池,这个东西不是咱们开发中需要使用的,那为什么要进行讲解呢,第一个是要解决你的疑问,第二个是现在面试会问.那我们就正式开始讲解了
        两个等于我们都用过了，就是进行判断的。判断两边的值是否一样，例如

            a = 10
            b = 10
            print(a == b)

            a = "alex"
            b = "alex"
            print(a == b)
            这样就是查看==两边的值是否一样.

        我们再来看看id是个什么东西，我们知道在定义一个变量的时候，内存空间中其实是开辟了一块空间，这个开辟的空间是有号码的，我们来试一下

            name = "alex"
            print(id(name))
            # 4327876736
            is 也是判断,只不过这次判断的是两边值得内存地址是否相同,我们来看看

            a = 10
            b = 10
            print(id(a))  # 4304849568
            print(id(b))  # 4304849568
            print(a is b)  # True
            # 获取的结果是True是因为a和b的内存地址是相同的

        发现一个问题 == 和 is 都是True啊,这个is是判断内存地址是否一样,Python考虑到我们会经常定义一些值,需要开辟空间和销毁空间,它底层就维护了一个小数据池,这个小数据就是规定一个区间使用的是同一个内存地址,比如小数据池中数字的区间范围是 -5 ~ 256,我们刚刚测试的10在区间内,所以获取到的是相同的内存地址,我们试一试不在范围的数字

            a = 500
            b = 500
            print(id(a)) # 4344811120
            print(id(b)) # 4344811120
            print(a is b) # True
            不再区间内，怎么内存地址还是一样的啊。这就要说说python的另一个机制 — 代码块

    【代码块】是防止我们频繁的开空间降低效率设计的，当我们定一个变量需要开辟空间的时候，它会先去检测我们定义的这个值在空间中有没有进行开辟，如果没有开辟就开辟一个空间，如果内存中开辟过就使用同一个。

    一个文件，一个函数，一个模块，一个类，终端中一行就是一个代码块

    代码块支持：

        字符串：
            定义字符串的时候内容，长度任意内存地址相同。
            字符串进行乘法的时候总长度 <=20 内存地址相同。
            中文，特舒符号 乘法的时候只能乘以1或 0
        数字：
            相同的数字内存地址相同
        布尔值：
            相同的内存地址相同
        这就是我们为什么在pycharm中测试的时候都是True，我们现在去终端上测试一下数字的范围

    【当代码块和小数据池两个在一起，先执行代码块】

    我们知道了代码块支持的数据类型和支持怎样的操作，现在来看看小数据池的支持数据类型和范围：

    小数据支持：

        字符串：
            纯字母和数字的时候长度任意，内存地址相同。
            Python3.6 纯字母和数字乘法总长度 <= 20 内存地址相同。
            Python3.7 纯字母和数字乘法总长度 <= 4096 内存地址相同。
            中文和特殊符号乘法的时候只能乘以 0 内存地址相同
        数字：
            -5 ～ 256
        布尔值：
            True
            False
    小数据池和代码块都是Python内置的,咱们开发的时候不使用,他们统称为驻留机制,有了小数据池和代码块能够提升Python的效率

二、Java中的驻留机制
    在Java中，也存在类似的驻留机制，主要体现在字符串驻留（String Interning）上。Java中的字符串是不可变的，因此JVM会维护一个字符串池（String Pool），用来存储字符串字面量和通过String.intern()方法显式驻留的字符串。

        例如：
            String a = "hello";
            String b = "hello";
            System.out.println(a == b); // true

            String c = new String("hello");
            String d = c.intern();
            System.out.println(a == d); // true

        对于整数，Java也有一个小整数池，范围是 -128 到 127。这个范围内的整数会被缓存，因此相同的整数对象会共享同一个内存地址。

        例如：
            Integer x = 100;
            Integer y = 100;
            System.out.println(x == y); // true

            Integer m = 200;
            Integer n = 200;
            System.out.println(m == n); // false

三、Scala中的驻留机制
    Scala作为运行在JVM上的语言，继承了Java的字符串驻留机制和小整数池机制。因此，Scala中的字符串和小整数也会自动享受JVM的优化。

        例如：
            val a = "hello"
            val b = "hello"
            println(a eq b) // true

            val x = 100
            val y = 100
            println(x eq y) // true

            val m = 200
            val n = 200
            println(m eq n) // false

总结：
    Python、Java和Scala都有类似的驻留机制，用来优化内存使用和提高性能。理解这些机制有助于编写更高效的代码，但在实际开发中，不应过于依赖这些机制来判断对象的相等性，而应当使用适当的比较运算符（如 == 和 equals）。
"""

# todo 此小数据池非彼数据池

"""
小数据池和数据池在概念上有相似之处，但它们并不完全相同。以下是对两者的详细解释：

    小数据池（Interning Pool）
        小数据池是编程语言（如 Python、Java 等）在其实现中用于优化内存使用的一种机制。它主要针对一些常用且值相对较小的数据（如小整数、短字符串等）进行缓存，以避免频繁创建和销毁相同值的对象。通过这种方式，可以提高性能和减少内存消耗。

        Python：在 Python 中，小数据池包括小整数池和字符串驻留机制。小整数池的范围通常是 -5 到 256。对于字符串，Python 会对一些短字符串进行驻留处理。
        Java：Java 中的小数据池主要体现在字符串驻留机制（String Interning）和小整数池（范围为 -128 到 127）。
        Scala：Scala 作为运行在 JVM 上的语言，继承了 Java 的字符串驻留机制和小整数池机制。

数据池（Data Pool）
    数据池是一个更广泛的概念，指的是在系统中预先分配的一块内存，用于存储和重用某些类型的数据。这种机制可以出现在多种环境中，如数据库连接池、线程池、对象池等。

    数据库连接池：在数据库应用中，连接池是一种用于管理数据库连接的池化技术。它通过预先建立一定数量的数据库连接，并在需要时重用这些连接，从而提高系统性能。
    线程池：线程池是一种用于管理线程的池化技术。它通过预先创建一定数量的线程，并在需要时重用这些线程，以减少线程创建和销毁的开销。
    对象池：对象池是一种用于管理对象实例的池化技术。它通过预先创建一定数量的对象，并在需要时重用这些对象，从而优化内存使用和提高性能。

    区别
        1. 范围和应用：
           小数据池：主要用于编程语言内部，对特定类型的小数据进行缓存和重用。
           数据池：范围更广，应用于各种系统资源管理，如数据库连接、线程、对象等。
        
        2. 实现目的：
           小数据池：优化编程语言运行时的内存使用和性能。
           数据池：优化系统资源的分配和使用，提高系统整体性能和响应速度。
        
        3. 使用方式：
           小数据池：通常是编程语言实现的一部分，开发者无需显式管理。
           数据池：通常需要开发者配置和管理，如设置连接池大小、线程池大小等。

总结来说，小数据池是数据池的一种特定形式，专注于编程语言内部的小数据缓存和重用。而数据池是一个更广泛的概念，涵盖了系统资源的管理和优化。
"""


a = 10
b = 10
print(a == b)

a = "alex"
b = "alex"
print(a == b)

# id
a = 10
b = 10
print(id(a))
print(id(b))
print(a is b)  # True
# 获取的结果是True是因为a和b的内存地址是相同的